Abstract

Titel: Einführung in Software Analytics

Beschreibung

In Unternehmen werden Datenanalysen intensiv genutzt, um aus Geschäftsdaten wertvolle Einsichten zu gewinnen. Warum nutzen wir als Softwareentwickler Datenanalysen dann nicht auch für unsere eigenen Daten?

In diesem Workshop stelle ich Vorgehen und Best Practices von Software Analytics vor. Wir sehen uns die dazugehörigen Open-Source-Werkzeuge an, mit denen sich Probleme in der Softwareentwicklung zielgerichtet analysieren und kommunizieren lassen.

Im Praxisteil mit Jupyter, pandas, jQAssistant, Neo4j & Co. erarbeiten wir gemeinsam wertvolle Einsichten aus Datenquellen wie Git-Repositories, Performancedaten, Qualitätsberichten oder auch direkt aus dem Programmcode. Wir suchen nach besonders fehleranfälligem Code, erschließen No-Go-Areas in Altanwendungen und priorisieren Aufräumarbeiten entlang wichtiger Programmteile.

Gerne kann bei diesem interaktiven Workshop direkt mitgearbeitet werden. Ein Notebook mit Internetzugang reicht hierfür völlig aus.


In [1]:
%matplotlib inline
import pandas as pd

Einführung in
Software Analytics

Markus Harrer, Software Development Analyst

@feststelltaste

ML Summit 2019, 14. Oktober 2019

Workshop-Aufbau (1/2)

1. Teil: Theorie & Hands-On

  • Einführung in das Thema "Software Analytics"
  • Vorgehen für Datenanalysen in der Softwareentwicklung
  • Werkzeuge für leichtgewichtiges Software Analytics

Workshop-Aufbau (2/2)

2. Teil: Praxis

  • Gemeinsame Durchführung erster Analysen
  • Bearbeitung von Aufgaben in Kleingruppen
  • Fragen & Antworten

Über mich

Datenanalysen in der Softwareentwicklung?

... ein typischer Projektverlauf

... ein typischer Projektverlauf

... ein typischer Projektverlauf

... ein typischer Projektverlauf

... ein typischer Projektverlauf

"Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten."


– Albert Einstein

Das (Tr|D)auerthema

Das (Tr|D)auerthema

"Software Analytics" als Retter?

Definition "Software Analytics"

"Software Analytics is analytics on software data for managers and software engineers with the aim of empowering software development individuals and teams to gain and share insight from their data to make better decisions."

Tim Menzies and Thomas Zimmermann

Welche Arten von Softwaredaten?

Alles was aus der Entwicklung und dem Betrieb der Softwaresysteme so anfällt:

  • Statische Daten
  • Laufzeitdaten
  • Chronologische Daten
  • Daten aus der Software-Community

Welche Werkzeuge, Datenquellen und Daten?

Sehr große Auswahl == sehr große Möglichkeiten?

(M)ein Problem mit (klassischem) Software Analytics

(M)ein Problem mit Software Analytics

(M)ein Problem mit Software Analytics

(M)ein Problem mit Software Analytics

(M)ein Problem mit Software Analytics

(M)ein Problem mit Software Analytics

(M)ein Problem mit Software Analytics

Andere sehen dieses Problem auch!

Thomas Zimmermann in "One size does not fit all":

"The main lesson: There is no one size fits all model. Even if you find models that work for most, they will not work for everyone. There is much academic research into general models. In contrast, industrial practitioners are often fine with models that just work for their data if the model provides some insight or allows them to work more efficiently."

Aber: "... the methods typically are applicable on different datasets."
=> Analyseideen sind wiederverwendbar!

"Es kommt drauf an!" aka Kontext

Individuelle Systeme == Individuelle Probleme => Individuelle Analysen => Individuelle Erkenntnisse!

Wie Software Analytics dann umsetzen?



Data Science

Eine leichtgewichtige Umsetzung von Software Analytics

Data Science

Was is Data Science?

"Statistics on a Mac."

https://twitter.com/cdixon/status/428914681911070720

Meine Definition

Was bedeutet "data"?

"Without data you‘re just another person with an opinion."

W. Edwards Deming

=> Belastbare Erkenntnisse mittels Fakten liefern

Was bedeutet "science"?

"The aim of science is to seek the simplest explanations of complex facts."

Albert Einstein

=> Neue Erkenntnisse verständlich herausarbeiten

Warum Data Science?

Große (Online-)Community

  • Kostenlose Online-Kurse, -Videos und Tutorials (z. B. DataCamp mit über 4,6 Mio. Mitgliedern)
  • Direkte Hilfestellungen (z. B. Stack Overflow oder Blog-Artikel)
  • Lernen und lernen von anderen durch Online-Wettbewerbe (e. g. Kaggle, )

Freie und einfach zu nutzende Werkzeuge!



Data Science liegt immer noch im Trend!


In [2]:
pd.read_csv("../datasets/google_trends_datascience.csv").plot();


"100" == max. Beliebtheit!

Mein "Bias"

  • Masterand: Schnelle Ergebnisse notwendig
  • Enterprise Java-Entwickler: Abends noch was Richtiges zu Stande bekommen
  • Allgemein: Weitere Standbeine "Data Science" und "Graphdatenbanken"

Wie weit weg sind SoftwareentwicklerInnen</b>
von Data Science?

Was ist ein Data Scientist?

"A data scientist is someone who
  is better at statistics
  than any software engineer
  and better at software engineering
  than any statistician."

From https://twitter.com/cdixon/status/428914681911070720

Nicht so weit weg wie gedacht!

Wie Software Analytics mit Data Science beginnen?

Bewährte Ansätze nutzen

Roger Pengs "Stages of Data Analysis"
I. Fragestellung
II. Explorative Datenanalyse
III. Formale Modellierung
IV. Interpretation
V. Kommunikation

=> von der Frage über die Daten zur Erkenntnis!

"Seven principles...

...of inductive software engineering" (Tim Menzies)

  1. Human before algorithms
  2. Plan for Scale
  3. Get Early Feedback
  4. Be Open Minded
  5. Be Smart with Your Learning
  6. Live with the Data You Have
  7. Develop a Broad Skill Set That Uses a Big Toolkit

Gedanken zur Analyse strukturieren



Wie nachvollziehbar umsetzen?

Verwende Literate Statistical Programming

(Intent + Code + Data + Results)
* Logical Step
+ Automation
= Literate Statistical Programming


Vehikel: Computational notebooks

Beispiel "Computational Notebook"


Wende Best Practices in Notebooks an


Pro Variable eine Spalte
Für jede Beobachtung eine Reihe
Für alle zusammengehörigen Variablen eine Tabelle
Für jede Tabelle einer Analyse eine verlinkende Spalte

Jeff Leek: The Elements of Data Analytic Style

Nutze Data Science Standardwerkzeuge

z. B. einen der populärsten Stacks

  • Jupyter Notebook
  • Python 3
  • pandas
  • matplotlib

Jupyter Notebook

Interactive Notebook

  • Dokumentenorientierte Analysen
  • Ausführbare Code-Blöcke
  • Ergebnisse direkt ersichtlich
  • Alles an einem Platz
  • Jeder Analyseschritt sichtbar

=> Neue Erkenntnisse verständlich herausarbeiten!

Python 3

Eine beliebte Programmiersprache im Data Science

  • Einfach
  • Effektiv
  • Schnell
  • Spaß
  • Automatisierung

=> Datenanalysen werden wiederholbar

pandas

Pragmatisches Datenanalysewerkzeug

  • Tabellenartige Datenstrukturen ("programmierbares Excel-Arbeitsblatt")
  • Sehr schnelle Berechnungen
  • Flexibel
  • Ausdrucksstarke API

=> Guter Integrationspunkt für Datenquellen!

matplotlib

Progammierbare Visualisierungsbibliothek

  • Pragmatische Erstellung von Grafiken
  • Diagramme wie Linien-, Balken-, XY-Diagramme und viele andere
  • Gut integriert mit pandas

=> Direkte Visualisierung der Diagramme / Ergebnisse!

Das Python-Ökosystem


Data Analysis
  • NumPy
  • scikit-learn
  • TensorFlow
  • SciPy
  • PySpark
  • py2neo
Visualisierung und mehr
  • pygal
  • Bokeh
  • python-pptx
  • RISE
  • Requests, xmldataset, Selenium, Flask...

=> Bietet in ganz individuellen Situationen die notwendige Flexibilität!

Andere Technologien

Jupyter Notebook arbeitet auch mit anderen Technologieplattformen zusammen, z. B. mit

  • jQAssistant Scanner / Neo4j Graphdatenbank
  • JVM-Sprachen via beakerx / Tablesaw
  • bash

=> Spezielle Technologie? Wird (meist) unterstützt!

Meine Empfehlungen zum Einstieg

Meine TOP 5's*

https://www.feststelltaste.de/category/top5/

Kurse, Videos, Blogs, Bücher und mehr...

**einige Seiten befinden sich noch in der Entwicklung*

Meine Buchempfehlungen

  • Adam Tornhill: Software Design X-Ray
  • Wes McKinney: Python For Data Analysis
  • Jeff Leek: The Elements of Data Analytic Style
  • Tim Menzies, Laurie Williams, Thomas Zimmermann: Perspectives on Data Science for Software Engineering
  • Mini-Tutorial unter https://github.com/feststelltaste/software-analytics-workshop

Hands-On

Einige Beispiele aus der Praxis

  • Vorhandenen Modularisierungsschnitt analysieren
  • Performance-Probleme in verteilten Systemen identifizieren
  • Potenzielle Wissensverluste ermitteln
  • Eingesetzte Open-Source-Projekte bewerten
  • ...

Was sind Ihre Analysen aus der Praxis?

Programmierbeispiel

Fallbeispiel

IntelliJ IDEA

  • IDE für Java-Entwickler
  • Fast komplett in Java geschrieben
  • Großes und lang aktives Projekt

I. Fragestellung (1/3)

  • Schreibe die Frage explizit auf
  • Erkläre die Anayseidee verständlich

I. Fragestellung (2/3)

Frage

  • Welche Quellcodedateien sind besonders komplex und änderten sich in letzter Zeit häufig?

I. Fragestellung (3/3)

Umsetzungsideen

  • Werkzeuge: Jupyter, Python, pandas, matplotlib
  • Heuristiken:
    • "komplex": viele Quellcodezeilen
    • "ändert ... häufig": hohe Anzahl Commits
    • "in letzter Zeit": letzte 90 Tage

Meta-Ziel: Grundmechaniken kennenlernen.

II. Explorative Datenanalyse

  • Finde und lade mögliche Softwaredaten
  • Bereinige und filtere die Rohdaten

Wir laden einen Datenexport aus einem Git-Repository.


In [3]:
log = pd.read_csv("../datasets/git_log_intellij.csv.gz")
log.head()


Out[3]:
additions deletions filename sha timestamp author
0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov
1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov
2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Wir sehen uns Basisinfos über den Datensatz an.


In [4]:
log.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1128819 entries, 0 to 1128818
Data columns (total 6 columns):
additions    1128819 non-null object
deletions    1128819 non-null object
filename     1128819 non-null object
sha          1128819 non-null object
timestamp    1128819 non-null object
author       1128819 non-null object
dtypes: object(6)
memory usage: 51.7+ MB

1 DataFrame (~ programmierbares Excel-Arbeitsblatt), 6 Series (= Spalten), 1128819 entries (= Reihen)

Wir wandeln die Zeitstempel von Texte in Objekte um.


In [5]:
log['timestamp'] = pd.to_datetime(log['timestamp'])
log.head()


Out[5]:
additions deletions filename sha timestamp author
0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov
1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov
2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Wir sehen uns nur die jüngsten Änderungen an.


In [6]:
# use log['timestamp'].max() instead of pd.Timedelta('today') to avoid outdated data in the future
recent = log[log['timestamp'] > log['timestamp'].max() - pd.Timedelta('90 days')]
recent.head()


Out[6]:
additions deletions filename sha timestamp author
0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov
1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov
2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov
4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Wir wollen nur Java-Code verwenden.


In [7]:
java = recent[recent['filename'].str.endswith(".java")].copy()
java.head()


Out[7]:
additions deletions filename sha timestamp author
27 1 10 platform/smRunner/src/com/intellij/execution/t... f4ed78c8f574 2019-06-28 18:28:41 Ilya.Kazakevich
29 28 0 platform/smRunner/testSrc/com/intellij/executi... f4ed78c8f574 2019-06-28 18:28:41 Ilya.Kazakevich
30 6 3 plugins/InspectionGadgets/InspectionGadgetsAna... a724467ad1a5 2019-07-01 19:47:38 Roman Shevchenko
31 2 2 plugins/InspectionGadgets/test/com/siyeh/igfix... a724467ad1a5 2019-07-01 19:47:38 Roman Shevchenko
32 2 2 plugins/InspectionGadgets/test/com/siyeh/igfix... a724467ad1a5 2019-07-01 19:47:38 Roman Shevchenko

III. Formale Modellierung

  • Schaffe neue Sichten
  • Verschneide weitere Daten

Wir zählen die Anzahl der Änderungen je Datei.


In [8]:
changes = java.groupby('filename')[['sha']].count()
changes.head()


Out[8]:
sha
filename
RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java 1
RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java 1
RegExpSupport/src/org/intellij/lang/regexp/RegExpFileType.java 5
RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java 16
RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java 15

Wir holen Infos über die Code-Zeilen hinzu...


In [9]:
loc = pd.read_csv("../datasets/cloc_intellij.csv.gz", index_col=1)
loc.head()


Out[9]:
language blank comment code
filename
java/java-tests/testData/psi/resolve/ThinletBig.java Java 299 1140 20125
java/java-tests/testData/psi/parser-full/declarationParsing/class/LongClass.java Java 10121 10164 10166
python/gen/com/jetbrains/python/console/protocol/PythonConsoleBackendService.java Java 1971 591 10086
jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java Java 502 3066 8605
plugins/java-decompiler/engine/testData/obfuscated/aj.java Java 551 1 8043

...und verschneiden diese mit den vorhandenen Daten.


In [10]:
hotspots = changes.join(loc[['code']]).dropna(subset=['code'])
hotspots.head()


Out[10]:
sha code
filename
RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java 1 1190.0
RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java 1 34.0
RegExpSupport/src/org/intellij/lang/regexp/RegExpFileType.java 5 40.0
RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java 16 92.0
RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java 15 168.0

VI. Interpretation

  • Erarbeite das Kernergebnis der Analyse heraus
  • Mache die zentrale Botschaft / neuen Erkenntnisse deutlich

Wir zeigen nur die TOP 10 Hotspots im Code an.


In [11]:
top10 = hotspots.sort_values(by="sha", ascending=False).head(10)
top10


Out[11]:
sha code
filename
platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchDialog.java 83 1097.0
platform/platform-impl/src/com/intellij/idea/IdeaApplication.java 71 366.0
platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java 67 1425.0
platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java 65 810.0
platform/lang-impl/src/com/intellij/build/BuildTreeConsoleView.java 63 936.0
java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java 63 1300.0
platform/platform-impl/src/com/intellij/idea/StartupUtil.java 62 551.0
platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java 60 1284.0
platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaComboBoxUI.java 59 606.0
platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java 57 299.0

V. Kommunikation

  • Transformiere die Erkenntnisse in eine verständliche Visualisierung
  • Kommuniziere die nächsten Schritte nach der Analyse

Wir erzeugen ein XY-Diagramm aus der TOP 10 Liste.


In [12]:
ax = top10.plot.scatter('sha', 'code');

for k, v in top10.iterrows():
    ax.annotate(k.split("/")[-1], v)


Ende der Demo

Weitere Analysebeispiele

  • Analyse der CPU-Auslastung mit Daten von vmstat
  • Abhängigkeitsanalyse mit Daten von jdeps und Visualisierung mit D3
  • Identifizierung von Modularisierungsoptionen basierend auf reinen Codeänderungen in Git
  • Analyse von Performance-Hotspots und Code-Smells mit jQAssistant / Neo4j

Zusammenfassung

1. Softwareanalysen mit Data-Science-Werkzeugen sind möglich
2. Wer mehr will bekommt auch mehr!
3. Es gibt unglaublich viele Quellen für Daten in der Softwareentwicklung

=> von der Frage über die Daten zur Erkenntnis!

Danke! Fragen?

Markus Harrer
innoQ Deutschland GmbH

markus.harrer@innoq.com

@feststelltaste

Weitere Ressourcen zum Workshop

GitHub-Repository: https://git.io/Jelju

Blog: https://feststelltaste.de